Parallel Braings - Параллельные Мозги - Лабораторная 2

Семинары по параллельному программированию

Рыбинск, РГАТА 2007

Список семинаров Форум Ссылки

Лабораторная работа №2
Многопоточное программирование. Threading in C#

Задача #4 - Readers-Writers: RWLock VS Mutex

Краткое описание:
Создать хранилище общих данных (например, список), реализующее операции поиска элемента по его значению и вставки элемента.
Реализовать три варианта данного хранилища:

  1. Хранилище, предполагающее последовательный доступ
  2. Хранилище, предполагающее параллельный доступ и использующее Mutex-ы
  3. Хранилище, предполагающее параллельный доступ и использующее элемент ReaderWriterLock
Сравнить время исполнения N операций над хранилищем, задавая различную вероятность операций поиска и изменения, во всех 3-х вариантах. При этом выводить статистику: сколько было произведено операций поиска и сколько - изменения.
Дополнительное ограничение:
Тестирование параллельного варианта хранилища провести как с использованием пула потоков (ThreadPool), так и без него(создавать потоки вручную). Сравнить результаты.
p.s. Для замеров времени Вы можете использовать Utility.PerfCounter или System.DateTime.Now;

Возможно изменение задачи с читатели-писатели на производители-потребители с буфером. В этом случае сложность задачи повышается на единицу. Неформальное описание:
Предполагается, что Вы реализуете три класса, в которых реализуете тот или иной доступ к хранилищу, а также отдельный класс для тестирования хранилища.
Возможен, например, такой вариант:

interface IDataBase{
  void add(int elem, int pos);
  int pos(int elem);
}
class SerialDB:IDataBase
{
 List data=new List();
 public void add(int elem, int pos){...}
 public int pos(int elem){...}
}
class ParallelDB_Mutex:IDataBase{...}
class ParallelDB_RWL:IDataBase{...}

class Testing
{
  static void Main()
  {
    SerialTest(new SerialDB(),0.01,1000);
    SerialTest(new ParallelDB_Mutex(),0.01,1000);
    ParallelTest(new ParallelDB_Mutex(),0.01,1000);
    ....
  }
  
  //последовательное обращение к хранилищу
  //p-вероятность выполнение операции add
  //n-общее число операций
  static SerialTest(IDataBase db, double p, int n)
  {
   ...
  }
  //параллельное обращение к хранилищу
  //p-вероятность выполнение операции add
  static ParallelTest(IDataBase db, double p, int n)
  {
   //в ручную создаем потоки, в которых с вероятностью p*n выполняем операцию add 
   //а с вероятностью (1-p)*n - pos
   ...
  }
  //параллельное обращение к хранилищу на базе пула потоков
  static ParallelPoolTest(IDataBase db, double p){...}
}

Содержание отчета к л.р.:

  1. Исходный код программы (или нескольких версий программы)
  2. Таблица временных замеров для каждого эксперимента со статистикой обращений

Возможные ошибки:

Не-thread-safe реализация подсчета статистики

Сайт создан в системе uCoz